"""
@version:python3
@author:大橘为重
@file:12-QLineEdit-验证器的使用.py
@time:2022/2/28 9:58
"""
# 0、导入需要的包和模块
from PyQt5.Qt import *
import sys

class AgeValidator(QValidator):
    def validate(self, input_str, pos_int):
        print(input_str,pos_int)

        # 判定字符串应该是纯数字组成且非空串
        try:
            if 18 <= int(input_str) <= 180:
                return (QValidator.Acceptable,input_str,pos_int)
            elif 1 <= int(input_str) < 18:
                return (QValidator.Intermediate,input_str,pos_int)
            else:
                return (QValidator.Invalid,input_str,pos_int)
        except:
            if len(input_str) == 0:
                return (QValidator.Intermediate, input_str, pos_int)
            return (QValidator.Invalid, input_str, pos_int)

    def fixup(self, p_str):
        print(p_str)
        try:
            if int(p_str) < 18: # 当空字符串传入时会导致崩溃
                return "18"
            return "180"
        except:
            return "18"

class MyValidator(QIntValidator):
    def fixup(self, p_str):
        print(p_str)
        if len(p_str) == 0 or int(p_str) < 18: #注意这里两个条件不能反过来
            return "18"

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QLineEdit-验证器的使用")
        self.resize(500, 500)
        self.setup_ui()
    def setup_ui(self): # 添加子控件以及子控件的配置操作
        le = QLineEdit(self)
        le.move(100,100)
        # 限制数字18-180
        validator = AgeValidator() # 自定义的验证器

        # validator = QIntValidator(18,180) # 系统自带的验证器，有bug，只能确定上限不能确定下限，如16
        # validator = MyValidator(18,180) # 使用自定义的验证器
        le.setValidator(validator)

        le2 = QLineEdit(self)
        le2.move(100,150)


# 1、创建一个应用程序对象
app = QApplication(sys.argv)

# 2、控件操作
# 创建控件、设置控件、事件和信号的处理
# 2.1 创建控件
window = Window()
# 2.2 设置控件


# 2.3 展示控件
window.show()

# 3、应用程序的执行，进入到消息循环
sys.exit(app.exec_())